/***************************************************************
 * Copyright(C) 2024, HTDisplay. All Rights Reserved
 *
 * This file is part of the HtDisplaySDK Project.
 *
 * @file    :  GpioController.h
 *
 * @brief   :  GPIO类
 *
 * @author  :  郑满乐
 *
 * @date    :  2024-11-19
 ***************************************************************/

#ifndef GPIOCONTROLLER_H
#define GPIOCONTROLLER_H


#include "BasicGpio.h"

/**
 * @class GpioController
 * @brief GPIO类.
 */
class  GpioController : public BasicGpio{
public:
    GpioController(std::string name);
    GpioController(int number, const std::string& direction);
    ~GpioController() override;

    /**
     * @brief 初始化GPIO.
     * @param 无.
     * @return true：初始化成功，false：初始化失败.
     */
    bool init() override;

    /**
     * @brief 设置GPIO值.
     * @param value：0 或 1.
     * @return true：设置成功，false：设置失败.
     */
    bool setValue(int value) override;

    /**
     * @brief 获取GPIO值.
     * @param value：0 或 1.
     * @return true：获取成功，false：获取失败.
     */
    bool getValue(int& value) override;

private:
    /**
     * @brief 检查文件是否存在.
     * @param path：文件路径.
     * @return true：文件存在，false：文件不存在.
     */
    bool fileExists(const std::string& path);

    /**
     * @brief 写入内容到文件.
     * @param path：文件路径.
     *        content：需要写的内容
     * @return true：写入成功，false：写入失败.
     */
    bool writeToFile(const std::string& path, const std::string& content);

    /**
     * @brief 读取文件内容.
     * @param path：文件路径.
     *        content：读取的内容
     * @return true：读取成功，false：读取失败.
     */
    bool readFromFile(const std::string& path, std::string& content);

    /**
     * @brief 解析软链接的真实路径.
     * @param path：软连接路径.
     * @return 解析后的路径.
     */
    std::string resolveSymlink(const std::string& path);

    /**
     * @brief 提取GPIO编号.
     * @param path：文件路径.
     * @return 提取出的编号.
     */
    int extractGpioNumber(const std::string& path);

    /**
     * @brief 提取GPIO方向.
     * @param name：文件路径.
     * @return 提取出的方向.
     */
    std::string extractGpioDirection(const std::string& name);

private:
    int gpioNumber;               // GPIO的编号
    std::string gpioDirection;    // GPIO的方向
};

#endif // GPIOCONTROLLER_H
